package controller;

import aplication.Rotulador;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.Image;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfWriter;
import data.JaxBXMLResultados;
import data.RepositorioDeQuestoes;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;
import java.util.logging.Level;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.embed.swing.SwingFXUtils;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Parent;
import javafx.scene.chart.PieChart;
import javafx.scene.control.Label;
import javafx.scene.image.WritableImage;
import javafx.scene.layout.Pane;
import javafx.scene.text.Text;
import javafx.stage.FileChooser;
import javafx.stage.Stage;
import javax.imageio.ImageIO;
import model.Avaliacao;
import model.Questao;

/*
 * Controler da view de resultados..
 */
public class ResultadoController implements Initializable {

    @FXML
    private PieChart grafico;
    @FXML
    private Text pontuacao;
    @FXML
    private Pane painelGrafico;
    @FXML
    private Label labelNick;
    @FXML
    private Label labelPontuacao;
    
    private static Font smallBold = new Font(Font.FontFamily.TIMES_ROMAN, 16,
            Font.BOLD);
    private Avaliacao avaliacao = RepositorioDeQuestoes.getInstance().getAvaliacao();

    /*
     * Metodo ao carregar a view..
     * Calcula a quantidade de pontos
     */
    @Override
    public void initialize(URL url, ResourceBundle rb) {

        double primeira = 0;
        double segunda = 0;
        double erro = 0;

        int quantidade = avaliacao.getQuestoes().size();
        for (Questao q : avaliacao.getQuestoes()) {
            if (!q.isAcerto()) {
                erro++;
            } else if (q.getSegundaTentativa() != null && q.isAcerto()) {
                segunda++;
            } else {
                primeira++;
            }
        }
        //Peso das respostas 
        //10 para primeiro acerto
        //5 para segundo acerto
        avaliacao.setPostos((primeira * 10) + (segunda * 5));

        //Chama o metodo para salvar a avaliaçao em XML por jaxB
        JaxBXMLResultados.salveAvaliacao(avaliacao);

        //Monta o grafico
        primeira = (primeira * 100 / quantidade);
        segunda = (segunda * 100 / quantidade);
        erro = (erro * 100 / quantidade);
        ObservableList<PieChart.Data> pieChartData = FXCollections.observableArrayList(
                new PieChart.Data("Primeira Tentativa " + primeira + "%", primeira),
                new PieChart.Data("Segunda Tentativa " + segunda + "%", segunda),
                new PieChart.Data("Erros " + erro + "%", erro));
        grafico.setData(pieChartData);
        grafico.setTitle("Resultado Final");
        labelNick.setText("O jogador " + avaliacao.getUsuario().getNome() + " obteve");
        labelPontuacao.setText(avaliacao.getPostos() + " pontos.");
    }

    /*
     * evento para voltar a tela principal
     */
    @FXML
    public void inicio(ActionEvent event) throws IOException {
        Parent root = FXMLLoader.load(getClass().getResource("/view/Principal.fxml"));
        Rotulador.getInstace().setStage(root);
    }

    /*
     * evento do butao para exportar o grafico em PNG
     * utiliza SnapShot (print scren do componente)
     */
    @FXML
    public void onExportPng(ActionEvent event) throws IOException {
        WritableImage snapShot = new WritableImage(600, 500);
        try {
            painelGrafico.snapshot(null, snapShot);
        } catch (Exception e) {
            Rotulador.getLOGGER().logp(Level.SEVERE, getClass().getSimpleName(), "onExportPng", "Erro de snapShot do componente!");
        }
        FileChooser fileChooser = new FileChooser();
        fileChooser.setInitialDirectory(new File(System.getProperty("user.home")));
        fileChooser.setTitle("Salvar imagem");
        fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("PNG", "*.png"));
        File file = fileChooser.showSaveDialog(new Stage());
        if (file != null) {
            if (!file.getName().endsWith(".png")) {
                file = new File(file.getAbsolutePath() + ".png");
            }
            try {
                ImageIO.write(SwingFXUtils.fromFXImage(snapShot, null), "png", file);
            } catch (Exception e) {
                Rotulador.getLOGGER().logp(Level.SEVERE, getClass().getSimpleName(), "onExportPng", "Erro ao salvar a imagem!");
            }
        }
    }

    /*
     * Evento onClick para exportar para pdf... ITEXT
     * Usa a ideia de snapshot (PrintScrin) do elemento da tela..
     */
    @FXML
    public void onExportPDF(ActionEvent event) throws IOException {
        WritableImage snapShot = new WritableImage(500, 400);
        try {
            grafico.snapshot(null, snapShot);
        } catch (Exception e) {
            e.getCause();
        }
        FileChooser fileChooser = new FileChooser();
        fileChooser.setInitialDirectory(new File(System.getProperty("user.home")));
        fileChooser.setTitle("Salvar imagem");
        fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("PDF", "*.pdf"));
        File file = fileChooser.showSaveDialog(new Stage());
        if (file != null) {
            if (!file.getName().endsWith(".pdf")) {
                file = new File(file.getAbsolutePath() + ".pdf");
            }
            Document doc = new Document();
            try {
                PdfWriter.getInstance(doc,
                        new FileOutputStream(file));

                doc.open();
                adicionaTitulo(doc);
                try {
                    //Gambiarra aki...
                    File fileAux = new File("chart.png");
                    ImageIO.write(SwingFXUtils.fromFXImage(snapShot, null), "png", fileAux);
                    Image img = Image.getInstance("chart.png");
                    doc.add(img);           
                    fileAux.delete();
                } catch (Exception e) {
                    Rotulador.getLOGGER().logp(Level.SEVERE, getClass().getSimpleName(), "onExportPDF", "Essa gambiarra não deu certo! " + e.getMessage());
                }
                doc.close();
            } catch (Exception e) {
                Rotulador.getLOGGER().logp(Level.SEVERE, getClass().getSimpleName(), "onExportPDF", "Erro ao gravar o arquivo PDF! " + e.getMessage());
            }
        }
    }

    /*
     * escreve no PDF...
     */
    private void adicionaTitulo(Document doc) throws DocumentException {
        Paragraph preface = new Paragraph();
        Paragraph titulo = new Paragraph("ROTULADOR DE IMAGENS TIGER'S", smallBold);
        titulo.setAlignment(Element.ALIGN_CENTER);
        //Titulo...
        preface.add(titulo);
        preface.setSpacingAfter(60);

        preface.add(new Paragraph("O jogador " + avaliacao.getUsuario().getNome() + " obteve "
                + avaliacao.getPostos() + " pontos. A figura abaixo ilustra o grafico de acertos."));
        doc.add(preface);
    }
}
